"use strict";
{
    //声明一个类之后, 会产生一个新的『类型』, 类型的名字跟类名一样
    class Computer {
        //方法
        constructor(brand, color, price) {
            this.brand = brand;
            this.color = color;
            this.price = price;
        }
        learn() {
            console.log('我可以用来学习~~~');
        }
    }
    //实例化 Computer 的类型要求 zjz 变量对象要包含 Computer 类中的属性以及方法
    // let zjz: Computer = new Computer('拯救者', '深灰', 9999);
    // let zjz = new Computer('xxx', '红色', 5862);
    //访问属性
    // console.log(zjz.price);
    // zjz.learn();
    //声明一个子类
    class Laptop extends Computer {
        //构造方法
        constructor(brand, color, price, size, memory, cpu) {
            //调用父类的构造方法
            super(brand, color, price);
            //成员方法
            this.learn = () => {
                console.log('learn learn learn');
            };
            //对子类属性进行初始化
            this.size = size;
            this.memory = memory;
            this.cpu = cpu;
        }
    }
    //实例化
    let lenove = new Laptop('联想', '黑色', 15699, '16inch', '32G', 'i7 11700H');
    lenove.learn();
}
{
    class A {
        constructor() {
            //公开的属性, 谁都可以访问, 在哪儿都可以访问
            this.propA = 'AAA';
            //受保护的属性, 该属性只能『在本类以及子类内部方法中』使用.
            this.propB = 'BBB';
            //私有的属性, 该属性值能在『本类内部的方法』使用
            this.propC = 'CCC';
        }
        fn2() {
            //访问公开的属性
            // console.log(this.propA);
            // console.log(this.propB);
            console.log(this.propC);
        }
    }
    class B extends A {
        fn() {
            //访问公开的属性 propA 
            // console.log(this.propA);
            // console.log(this.propB);
            // console.log(this.propC);// X 不能访问父类的私有属性
        }
    }
    let b = new B();
    //public 成员
    // console.log(b.propA);
    //protected 成员. 类外部不能访问 protected 修饰的成员
    // console.log(b.propB); //属性“propB”受保护，只能在类“A”及其子类中访问
    //private 成员
    // console.log(b.propC); //属性“propC”为私有属性，只能在类“A”中访问
    b.fn();
    b.fn2();
}
